package com.nb.sdk;

import com.alibaba.fastjson.JSONObject;
import com.nb.sdk.Client;
import com.nb.sdk.Api;
import com.nb.sdk.NbSdkException;

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;

/**
 *  Java 动态代理机制的核心接口。其主要作用是定义了代理类的行为
 */
public class HttpInvokeHandler implements InvocationHandler {

    /**
     * 客户端
     */
    private Client client;

    public HttpInvokeHandler(Client client) {
        this.client = client;
    }

    /**
     * 当代理对象的方法被调用时，这个方法会被触发。
     * 代理的哪个方法被掉用，就把代理对象、方法及参数传过来，首先加自己的业务逻辑，再调用被代理对象的方法。
     * 你可以在 invoke 方法中定义代理逻辑，例如在调用目标方法前后插入日志，或者在调用目标方法时捕获和处理异常等。
     * 三个参数：
     * @param proxy 代表动态代理对象
     * @param method 代表正在被调用的方法
     * @param args 代表调用方法时传入的参数
     * @return
     * @throws Throwable
     */
    @Override
    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
        //System.out.println("http请求处理-开始~~~");

        Api apiAnno = method.getAnnotation(Api.class);
        if(apiAnno == null){
            throw new NbSdkException(-1,"api name undefined");
        }
        String apiName = apiAnno.value();
        //System.out.println("调用的api名字:"+apiName);
        //System.out.println("请求参数:"+ JSONObject.toJSONString(args));

        Class<?> returnType = method.getReturnType();

        //System.out.println("方法返回值类型:"+returnType.getName());
        Object result = client.execute(apiName, args, returnType);
        //System.out.println("http请求处理-结束~~~");
        return result;
    }
}
